# @Time : 2021/4/7 15:27
# @Author : Fioman 
# @Phone : 13149920693
"""
设备的相机图像参数模块,主要用来保存设备的一些参数信息,供以后设备来使用
"""
import threading

from db_tools.db_handler import DbHandler
from tools.hd_logger import HdLogger


def synchronized(func):
    """
    线程安全的装饰器,加一个线程锁
    :param func:
    :return:
    """
    func.__lock__ = threading.Lock()

    def lock_func(*args, **kwargs):
        with func.__lock__:
            return func(*args, **kwargs)

    return lock_func


class ConfigParams(object):
    __cpInstance__ = None
    __initFlag__ = False

    @synchronized
    def __new__(cls, *args, **kwargs):
        if cls.__cpInstance__ is None:
            cls.__cpInstance__ = object.__new__(cls)
        return cls.__cpInstance__

    def __init__(self):
        if not self.__initFlag__:
            print("ConfigParams.__init__() 进行初始化")
            self.db = DbHandler()
            self.logger = HdLogger()
            self.reload_config_params()
            self.__initFlag__ = True

    def reload_config_params(self):
        """
        重新加载设备参数,包括相机和算法,将设备的参数加载刷新一次.
        :return:
        """
        tableName = "configParams"
        query = {
            "key": "1"
        }
        res, configParams = self.db.get_data_one(tableName, query)
        if res != "ok":
            errorInfo = "in ConfigParams.reload_config_params() error: {}".format(configParams)
            print(errorInfo)
            self.logger.debug(errorInfo)
        else:
            self.cameraWidth = configParams.get('cameraWidth')  # 拍摄的宽度
            self.cameraHeight = configParams.get('cameraHeight')  # 拍摄高度
            self.heightWidthRatio = configParams.get("heightWidthRatio")  # 高宽比
            self.mm2pix = configParams.get("mm2pix")  # 像素比
            self.middleJointPos = configParams.get("middleJointPos")  # 中缝拼接处
            self.sensorPos = configParams.get("sensorPos")  # 传感器拍照的起点y坐标
            self.tablePosStart = configParams.get("tablePosStart")  # 台布的x起始位置
            self.tablePosEnd = configParams.get("tablePosEnd")  # 台布的x终点位置
            self.leftExposeValue = configParams.get("leftExposeValue")  # 左相机的曝光值
            self.rightExposeValue = configParams.get("rightExposeValue")  # 右相机的曝光值
            self.tableValUsed = configParams.get("tableValUsed", 15)  # 台布使用的亮度阈值
            self.sensorValUsed = configParams.get("sensorValUsed", 15)  # 传感器那边的板子使用的亮度阈值
            self.calcArgs = configParams.get("calcArgsZj01")  # 使用的算子
            self.sizeScale = configParams.get("sizeScale", 1.2)  # 前端界面图像显示的宽度
            self.sizeScale = round(self.mm2pix / self.sizeScale, 3)  # 真正使用的像素缩放比例.
            self.longCropperLimit = configParams.get("longCropperLimit")  # 长铜箔的长度limit,是否是长铜箔的极限位置
            self.minOrderSIzeErrorThres = configParams.get("minOrderSIzeErrorThres", 10)  # 首板作业尺寸和工单尺寸最小尺寸对比
            self.maxOrderSIzeErrorThres = configParams.get("maxOrderSIzeErrorThres", 10)  # 首板作业尺寸和工单尺寸最大尺寸对比
            self.middleOffset = configParams.get("middleOffset", 0)  # 中缝偏移补偿,默认是1mm
            self.knifeAngleList = configParams.get("knifeAngleList", [0, 180, 0, 180])
            self.widthLimit = configParams.get("widthLimit", [22, 30])
            self.heightLimit = configParams.get("heightLimit", [17, 26])
            print("参数加载: sizeScale: {},拍摄宽度: {},拍摄高度: {},像素比: {},中缝拼接处:{},高宽比:{},长铜箔的极限值:{}".format(
                self.sizeScale, self.cameraWidth, self.cameraHeight, self.mm2pix, self.middleJointPos, self.heightWidthRatio, self.longCropperLimit))
